<?php
/**
 * 基础类
 *
 * @author      robert<37500144@qq.com>
 * @since       1.0
 */
class Apibase extends DatabaseBase{
	
	public $isLogin = true;                   //是否判断登陆状态
    public $uid = 0;                          //公共参数（UID）
    public $request;                          //公共参数（请求的方法）
    public $gameId;                           //公共参数（游戏ID）
    public $platform;                         //公共参数（平台）
    public $channelId;                        //公共参数（游戏渠道）
    public $ver;                              //公共参数（游戏版本）
	public $timenow;                          //公共参数（当前时间）
    public $params;                           //专用参数转为数组存储
    public $mysql;                            //MYSQL数据链接
    public $redis;                            //redis数据链接
    public $validateToken = true;             //是否验证TOKEN
    private $key = "6IC34xd(un*cec4kjc!168";  //加密串私钥

    /**
     * Function init()
     * 初始化函数
     */
	public function init() {
		//如果需要判断登陆
		if ($this->isLogin) {}

		//如果存在GET输入数据，将数据转为数组
        if (isset($_GET)) {
			//输入信息写入日志
			$this->i(json_encode($_REQUEST));
			
            //判断SIGN是否正确
			$arrSign = $_GET;
			$arrSign['params'] = $_REQUEST['params'];
            // $this->sign($arrSign, $this->validateToken);

            //将输入数据赋值给全局变量
			$this->uid = $_GET['uid'];
			$this->request = $_GET['request'];
			$this->gameId = $_GET['gameId'];
			$this->platform = $_GET['platform'];
			$this->channelId = $_GET['channelId'];
			$this->ver = $_GET['ver'];
			$this->timenow = $_GET['timenow'];
			$this->params = json_decode($_REQUEST['params'], true);
		}
	}


    /**
     * Function sign($inputArray)
     * 校验输入数组
     *
     * @access public
     * @param  array $inputArray 输入数组
     * @return true
     */
    public function sign($inputArray, $validateToken = false)
    {
        if (!empty($inputArray)) {
            ksort($inputArray);
            $str = "";
            foreach($inputArray as $key => $val){
                if ($key != "sign") {
                    $param = $key."=".urlencode($val);
                    $str .= $str ? "&" . $param : $param;
                } else {
                    $sign = $val;
                }
            }

            $str .= "&key=".$this->key;

            //TOKEN验证
            if ($validateToken){
                $userInfo = $this->redis('user_info')->hMget("U:".$inputArray['uid'], array('token'));
                $str .= "&token=".$userInfo['token'];
            }

            if ($sign == md5($str) && !empty($sign)) {
                return true;
            } else {
                $record = "str:".$str."||".$sign."||".md5($str);
                $this->i($record);

                //非生产环境测试账号
                if (_APP_MODE !== 'product') {
                    if (property_exists('TestConfig', 'test_users') && is_array(TestConfig::$test_users)) {
                        $testUsers = TestConfig::$test_users;
                        if (in_array($_GET['uid'], $testUsers)) {
                            return true;
                        }
                    }
                }

                //返回错误
                $this->i('validateToken' , $validateToken);
                $this->i($str);
                $this->i('request_url' , $_SERVER['REQUEST_URI']);
                $this->i('params' , $inputArray['params']);
                $this->returnError('exception_data');
            }
        } else {
            $this->returnError('exception_input');
        }
    }

    /**
     * Function before()
     * 前置条件判断
     * @return true
     */
	public function before() {

        return true;
	}

    /**
     * Function logic()
     * 运行逻辑
     * @return true
     */
	public function logic() {

        return true;
	}

    /**
     * Function after()
     * 关闭数据库
     * @return true
     */
	public function after() {

        return true;
	}


    /**
     * 检测用户
     * @param bool $getUser
     * @return array
     */
    public function checkUser($getUser = false)
    {
        $redis = $this->redis('user_info');

        if (empty($this->uid)) {
            $this->returnError('no_user');
        }

        $result = $redis->exists('U:' . $this->uid);
        if (!$result) {
            $this->returnError('no_user');
        }

        $userInfo = array();

        if ($getUser) {
            $userQuery = new UserQuery();
            $userInfo = $userQuery->getUserInfo($this->uid, $this->platform);
        }

        return $userInfo ? $userInfo : array();
    }
}

	
